Deep Learning I
5. 深度学习计算
WU Xiaokun 吴晓堃
xkun.wu [at] gmail
2021/02/21
考虑一个L层的神经网络
\begin{aligned} \textbf{h}^t &= f_t(\textbf{h}^{t-1})\\ y &= l \circ f_L \circ \dots \circ f_1(\textbf{x})\\ \end{aligned}
计算梯度
\begin{aligned} \frac{\partial l}{\partial \textbf{W}^t} &= \frac{\partial l}{\partial \textbf{h}^L} \frac{\partial \textbf{h}^L}{\partial \textbf{h}^{L-1}} \dots \frac{\partial \textbf{h}^{t+1}}{\partial \textbf{h}^{t}} \frac{\partial \textbf{h}^{t}}{\partial \textbf{W}^{t}}\\ &= \frac{\partial l}{\partial \textbf{h}^L} \prod_{i=t+1}^L \frac{\partial \textbf{h}^i}{\partial \textbf{h}^{i-1}} \frac{\partial \textbf{h}^{t}}{\partial \textbf{W}^{t}} \end{aligned}
梯度爆炸
梯度消失
线性输出并激活
\begin{aligned} f_t(\textbf{h}^{t-1}) &= \sigma(\textbf{W}^t\textbf{h}^{t-1})\\ \frac{\partial \textbf{h}^{t}}{\partial \textbf{h}^{t-1}} &= \text{diag}\left( \sigma'(\textbf{W}^t\textbf{h}^{t-1}) \right)(\textbf{W}^t)^T\\ \end{aligned}
链式法则计算梯度
\begin{aligned} \prod_{i=t+1}^L \frac{\partial \textbf{h}^i}{\partial \textbf{h}^{i-1}} = \prod_{i=t+1}^L \text{diag}\left( \sigma'(\textbf{W}^i\textbf{h}^{i-1}) \right)(\textbf{W}^i)^T \end{aligned}
假设使用最常用的ReLU激活函数
\sigma(x) = \text{max}(0,x), \sigma'(x) = \left\{ \begin{array}{ll} 1 & \text{if}\ x > 0 \\ 0 & \text{otherwise} \\ \end{array}\right.
代入MLP的梯度计算公式
\begin{aligned} \prod_{i=t+1}^L \frac{\partial \textbf{h}^i}{\partial \textbf{h}^{i-1}} &= \prod_{i=t+1}^L \text{diag}\left( \sigma'(\textbf{W}^i\textbf{h}^{i-1}) \right)(\textbf{W}^i)^T\\ &= \prod_{i=t+1}^L (\textbf{W}^i)^T \end{aligned}
上溢:梯度值超出浮点数值域
导致对学习率敏感
根据实际情况:可能需要在训练过程中动态调整学习率
假设使用sigmoid作为激活函数:导数值很小
\sigma(x) = \frac{1}{1+\exp^{-x}}, \sigma'(x) = \sigma(x)(1-\sigma(x))
\begin{aligned} \prod_{i=t+1}^L \frac{\partial \textbf{h}^i}{\partial \textbf{h}^{i-1}} &= \prod_{i=t+1}^L \text{diag}\left( \sigma'(\textbf{W}^i\textbf{h}^{i-1}) \right)(\textbf{W}^i)^T\\ \end{aligned}
下溢:梯度值变成0
训练不进展:损失值不下降
由于反向传递:对底部层尤为严重,只能训练顶部层
目标:将梯度值控制在合理范围
将每层的输出和梯度看成随机变量
正向积累
\begin{aligned} \mathbb{E}[h_i^t] &= 0\\ Var[h_i^t] &= a \end{aligned}
反向传递
\begin{aligned} \mathbb{E}[\frac{\partial l}{\partial h_i^t}] &= 0\\ Var[\frac{\partial l}{\partial h_i^t}] &= b \end{aligned}
优化:想象成在地形图上撒小球
参数初始值等价于初始位置:应该控制在合理范围
之前使用正态分布初始化:不适合复杂神经网络
基本假设
首先假设没有激活函数:\textbf{h}^{t} = \textbf{W}^t\textbf{h}^{t-1}, \textbf{W}^t \in \mathbb{R}^{n_t \times n_{t-1}}
\begin{aligned} \mathbb{E}[h_i^t] &= \mathbb{E} \left[ \sum_j w_{i,j}^t h_j^{t-1} \right]\\ &= \sum_j \mathbb{E}[w_{i,j}^t] \mathbb{E}[h_j^{t-1}]\\ &= 0 \end{aligned}
\begin{aligned} Var[h_i^t] &= \mathbb{E}[(h_i^t)^2] - \mathbb{E}[h_i^t]^2\\ &= \mathbb{E} \left[ \left( \sum_j w_{i,j}^t h_j^{t-1} \right)^2 \right]\\ &= \mathbb{E} \left[ \sum_j \left( w_{i,j}^t \right)^2 \left( h_j^{t-1} \right)^2 + \sum_{j \ne k} w_{i,j}^tw_{i,k}^t h_j^{t-1}h_k^{t-1} \right]\\ &= \sum_j \mathbb{E} \left[ \left( w_{i,j}^t \right)^2 \right] \mathbb{E} \left[ \left( h_j^{t-1} \right)^2 \right]\\ &= \sum_j Var[w_{i,j}^t]Var[h_j^{t-1}]\\ &= n_{t-1} \gamma_t Var[h_j^{t-1}] \end{aligned}
\begin{aligned} Var[h_i^t] &= n_{t-1} \gamma_t Var[h_j^{t-1}] \end{aligned}
\begin{aligned} \textbf{h}^{t} = \textbf{W}^t\textbf{h}^{t-1} &\Rightarrow \frac{\partial l}{\partial \textbf{h}^{t-1}} = \frac{\partial l}{\partial \textbf{h}^{t}} \textbf{W}^t\\ &\Rightarrow \left( \frac{\partial l}{\partial \textbf{h}^{t-1}} \right)^T = (\textbf{W}^t)^T \left( \frac{\partial l}{\partial \textbf{h}^{t}} \right)^T \end{aligned}
略去中间步骤得到
\begin{aligned} \mathbb{E} \left[ \frac{\partial l}{\partial h_t^{t-1}} \right] &= 0\\ Var \left[ \frac{\partial l}{\partial h_t^{t-1}} \right] &= n_t \gamma_t Var \left[ \frac{\partial l}{\partial h_t^{t}} \right] \end{aligned}
结论:n_{t-1} \gamma_t = 1, n_{t} \gamma_t = 1作为初始化的公式
按照定义:Var[w_{i,j}^t] = \gamma_t
讨论完无激活函数后,其次假设 \sigma(x) = a x + b
正向积累
反向传递
\begin{aligned} \text{sigmoid} &= \frac{1}{2} + \frac{x}{4} - \frac{x^3}{48} + O(x^5)\\ \text{tanh} &= 0 + x - \frac{x^3}{3} + O(x^5)\\ \text{relu} &= 0 + x, \text{for}\ x \ge 0\\ \end{aligned}
由线性激活的启发:可以调整sigmoid:4 \times \text{sigmoid} - 2
线性模型的基本元素:
多层感知机:每个层可以看成线性模型
块 block可以描述单个层、由多个层组成的组件或整个模型本身
之前模型:参数由优化器自动更新
设计出适用于各种任务的架构
创新设计:发明一个在当前深度学习框架中还不存在的模块
保存文件是良好习惯
迁移学习:将模型参数应用到不同任务
部署应用:使用训练好的模型
个人电脑
云计算服务:通常有自动化解决方案、客服
Intel i7-6700K:0.15 TFLOPS
Nvidia GP104 (Pascal):12 TFLOPS
| CPU + 内存 | GPU | |
|---|---|---|
| #核 | 4 - 64 | 2k - 4k |
| TFLOPS | 0.2 - 1 | 10 - 100 |
| 内存 | 32GB - 1TB | 16GB - 32GB |
| 内存带宽 | 30GB/s - 100 GB/s | 400GB/s - 1TB/s |
| 控制流 | 强 | 弱 |
默认情况下,张量是在内存中创建,然后使用CPU计算
torch.device('cpu'):所有物理CPU和内存torch.device('cuda'):一个卡和相应的显存
torch.device(f'cuda:{i}'):第 i 块GPU( i 从0开始)cuda:0和cuda是等价的注意:操作必须在同一设备上!
少用控制语句:支持有限
尽量不要在设备(CPU、GPU和其他机器)之间传输数据
如果必要,合并操作
专用集成电路 Application-Specific Integrated Circuit (ASIC)
中间结果向右传;输出向下传
中间结果向右传;输出向下传
中间结果向右传;输出向下传
数值稳定性。Xavier 初始化。层、块。参数管理。自定义层。读写文件。并行架构。
重点:数值不稳定的两个表现:梯度爆炸、梯度消失;Xavier 初始化的结论;层、块的构建方法;参数管理的方法;自定义层的方法;读写文件的方法;并行架构的使用方法。
难点:数值不稳定可能带来的问题;初始化的重要性;并行计算原则。
简述数值不稳定的两个表现,及其可能带来的问题。
简述优化问题中初始化的重要性。
简述并行架构特点、计算原则。